package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.media.Sound;
	import flash.media.SoundChannel;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.system.System;
	import flash.text.TextField;

	public class LRCPlayer extends Sprite
	{
		private var lrc_txt:TextField=new TextField();
		private var LRCarray:Array=new Array();
		private var sc:SoundChannel;

		public function LRCPlayer()
		{
			/**
			 * 		ActionScript 3 中默认使用 Unicode 来解码外部文件，如果读取的文本不是 Unicode 编码，
			 * 而是按照操作系统代码页编写的，比如 GB2312，那么需要先导入 flash.system.System 类，
			 * 并在加载外部文本的语句前将 System.useCodePage 设为 true，默认情况下为 false，即默认不使用操作系统页解码。
			 * 		如果 System.useCodePage = false 且外部 LRC 文件编码格式是 ANSI 的话，那么显示的中文歌词会是乱码。
			 * 解决办法有两个：一是，将外部 LRC 文件编码格式改为 Unicode；
			 * 二是，不改变外部文件编码格式，只在文档类中加入一句 System.useCodePage=true 即可。
			 * 由于后一种方法使用简便，我们就采用第二种方法。
			 * */
			System.useCodePage=true;
			lrc_txt.width=500;
			lrc_txt.selectable=false;
			addChild(lrc_txt);
			var loader:URLLoader=new URLLoader();
			loader.load(new URLRequest("../assets/周杰伦-青花瓷.lrc"));
			loader.addEventListener(Event.COMPLETE, LoadFinish);
			var sound:Sound=new Sound();
			sound.load(new URLRequest("../assets/周杰伦-青花瓷.mp3"));
			//播放声音，并生成 sc 变量，SoundChannel 类的实例 stage.addEventListener(Event.ENTER_FRAME,SoundPlaying);
			sc=sound.play();
			//实时刷新歌词
			stage.addEventListener(Event.ENTER_FRAME, SoundPlaying);
		}

		private function SoundPlaying(evt:Event):void
		{
			var lrcLength:int=LRCarray.length;
			for (var i:int=1; i < lrcLength; i++)
			{

				if (sc.position < LRCarray[i].timer)
				{ //找到歌词，跳出循环体
					lrc_txt.text=LRCarray[i - 1].lyric;
					break;
				}
				//找不到歌词，说明已超出了最后一句的时间，因此显示最后一句歌词
				lrc_txt.text=LRCarray[lrcLength - 1].lyric;
			}
		}

		private function LoadFinish(evt:Event):void
		{
			var list:String=evt.target.data;
			var listarray:Array=list.split("\n");
			//建立正则表达式，范围：[00:00.00]～[59:59.99]
			var reg:RegExp=/\[[0-5][0-9]:[0-5][0-9].[0-9][0-9]\]/g;
			var listLength:int=listarray.length;
			for (var i:int=0; i < listLength; i++)
			{
				//提取每行内容，用变量 info 保存
				var info:String=listarray[i];
				//将匹配的时间序列保存到 timeAry 数组中
				var timeAry:Array=info.match(reg);
				//该行拥有时间序列的个数
				var len:int=timeAry.length;
				//根据每个时间序列占10个字符，找出歌词内容的起点
				//将歌词提取到 lyric 变量中
				var lyric:String=info.substr(len * 10);
				for (var k:int=0; k < len; k++)
				{
					//将时间序列转换为毫秒并与歌词一起保存为一个数组元素
					var obj:Object=new Object();
					var ctime:String=timeAry[k];
					//将时间字串转换为计算机可读取的时间
					var ntime:Number=Number(ctime.substr(1, 2)) * 60 + Number(ctime.substr(4, 5));
					obj.timer=ntime * 1000;
					obj.lyric=lyric;
					//将时间与歌词保存到一个 Object 中，并压入LRCarray 数组
					LRCarray.push(obj);
				}
			}
			LRCarray.sort(compare);
		}

		//将获得的 LRCarray 数组按起始时间排序，这对于按序读取歌词有重要意义；
		private function compare(paraA:Object, paraB:Object):int
		{
			if (paraA.timer > paraB.timer)
			{
				return 1;
			}
			if (paraA.timer < paraB.timer)
			{
				return -1;
			}
			return 0;
		}
	}
}